要素同步 Sample详情

最后更新时间:2019年6月17日

要素同步编辑,即涉及地图某一图层要素的下载、更新、提交操作。首先,用户可以将IGServer服务器上发布的矢量图层要素数据下载到本地数据库中;当服务器上发布的图层要素数据发生变化时,对本地数据库中的图层数据进行更新;当本地数据库中矢量图层要素数据发生变化时,可以将变更数据提交到服务器进行同步。

一、下载

当用户需要在移动端离线使用IGServer服务器上发布的矢量图层数据时,可以将其图层全部下载或者设置范围和属性条件下载到本地“.mgdb”数据库中。

需要注意的是:下载数据时,要保证程序运行的网络流畅,如果网络速度较慢或者网络情况不佳的话,下载速度会比较慢,也有可能导致下载失败。

要素同步编辑下载,基于数据类型与素筛选条件可以分为以下几种方式,如图所示。

要素同步下载分类.jpg

要素同步下载功能实现的关键步骤如图 6 8所示:

要素同步下载实现流程.png

1

获取下载数据信息

获取下载数据信息,可通过登录IGServer服务管理器直接查看,也可通过代码方式获取;

String IGServerBaseURL = ""http://webclient.smaryun.com:6163/igs";    //服务基地址
String LayerURL="gdbp://MapGisLocal/武汉MKT/sfcls/四级点";           //图层URL

2

设置数据保存位置

设置数据保存位置,要素同步编辑中的下载是下载到已有数据库中。

//数据库在手机内存中的路径
String databasePath=Environment.getExternalStorageDirectory().getPath()+"/MapGIS Mobile 2D Sample/Map/MapEdit/武汉MKT.mgdb";
//创建数据库对象
DataBase dataBase=new DataBase();
//打开本地路径中的数据库
dataBase.open(databasePath);

3

创建下载条件

创建下载条件,下载按筛选条件分为全图范围、部分范围和属性条件。

Rect rect=new Rect(xMin,yMin, xMax,yMax); 
String condition="Name like '%公园%'";

4

数据下载

进行数据的下载,首先需要根据下载的数据类型(图层服务或地图服务)、下载的条件选择合适的下载接口,com.zondy.mapgis.core.featureservice.FeatureSync类提供的接口如下所示:

接口 说明
downloadAllASync(java.lang.String strIGServerBaseURL, java.lang.String strDataURL, DataBase database, XClsType clsType, java.lang.String clsName)
参数:服务基地址、图层URL、数据库、要素类型、类名
全图下载异步执行
downloadASync(java.lang.String strIGServerBaseURL, java.lang.String strDataURL, Rect extent, java.lang.String whereClause, DataBase database, XClsType clsType, java.lang.String clsName)
参数:服务基地址、图层URL、范围、属性条件、数据库、要素类型、类名
指定范围下载异步执行
downloadAllASync(java.lang.String strIGServerBaseURL, java.lang.String strDocName, int mapID, int layerID, DataBase database, XClsType type, java.lang.String clsName)
参数:服务基地址、地图文档名、地图ID、图层ID、数据库、要素类型、类名
全图下载异步执行
downloadASync(java.lang.String strIGServerBaseURL, java.lang.String strDocName, int mapID, int layerID, Rect extent, java.lang.String whereClause, DataBase database, XClsType clsType, java.lang.String clsName)
参数:服务基地址、地图文档名、地图ID、图层ID、范围、属性条件、数据库、要素类型、类名
指定范围下载异步执行

接口说明:

(1)前两个接口适合于图层服务的数据下载、后两个接口适合地图文档服务类型数据的下载。在此说明图层服务和地图文档服务的区别:

(2)第一个和第三个接口是默认下载图层中全部范围数据的,第二个和第四个接口中可以指定下载的地图范围,以及下载的属性过滤条件。

在明确了接口的作用之后,根据实际情况选择对应的接口下载数据,如果数据为图层服务,可采用如下方法实现:

//图层服务-全图下载(参数:服务基地址、图层URL、数据库、要素类型、类名)
long downSync=FeatureSync.downloadAllASync(IGServerBaseURL, LayerURL, dataBase, XClsType.SFCls, clsName);   //clsName为本地数据库中简单要素类名,如“四级点”,一般和下载的图层名保持一致

//图层服务-范围下载(参数:服务基地址、图层URL、范围、属性条件、数据库、要素类型、类名)
long downSync=FeatureSync.downloadASync(IGServerBaseURL, LayerURL, rect, null, dataBase, XClsType.SFCls, clsName);   //如果范围和属性条件都设置为空,默认下载全图

//图层服务-属性条件下载
long downSync=FeatureSync.downloadASync(IGServerBaseURL, LayerURL,null, condition, dataBase, XClsType.SFCls, clsName);

如果数据为地图服务,采用如下方法:

//地图服务-全图下载(参数:服务基地址、地图文档名、地图ID、图层ID、数据库、要素类型、类名)
long downSync=FeatureSync.downloadAllASync(IGServerBaseURL, docName, 0, clsID, dataBase, XClsType.SFCls, clsName);

//地图服务-范围下载(参数:服务基地址、地图文档名、地图ID、图层ID、范围、属性条件、数据库、要素类型、类名)
long downSync=FeatureSync.downloadASync(IGServerBaseURL, docName, 0, clsID, rect, null, dataBase, XClsType.SFCls, clsName);   //如果范围和属性条件都设置为空,默认下载全图

//地图服务-属性条件下载
long downSync=FeatureSync.downloadASync(IGServerBaseURL, docName, 0, clsID, null, condition, dataBase, XClsType.SFCls, clsName);

说明:

(1)所有的下载方法都为静态方法,直接使用类名调用即可。

(2)所有的下载方法都是异步方法,并附带监听,不需要用户开启子线程。

(3)返回结果代表下载编号,可以支持多任务并发执行。

(4)如果下载过程中需要停止,可以调用stopASync()方法,同样适用于后续的更新、提交操作。

5

下载回调监听

数据下载是一个过程,接口将下载的操作封装在子线程中,属于异步执行。SDK提供了监听方法来不断获取下载的进度等信息。

//下载进程回调(非主线程回调)
FeatureSync.setProgressListener(new ProgressListener() {
    @Override
    public void onProgress(long arg0, long arg1, long arg2, double arg3) {
        if (arg0==downSync) {
            Log.e("down", "下载任务编号:"+arg0+"\n图层总数:"+arg1+"\n当前图层ID:"+arg2+"\n下载进度:"+arg3+"%");
        }
    }
});

同时,SDK也提供了下载的结果监听方法。

//下载结果回调(非主线程回调)
FeatureSync.setFinishedListener(new FinishedListener() {
    @Override
    public void onFinished(long syncCode, boolean normalSuccessed) {
        //回调函数参数:同步编辑的任务编码、是否正常完成
        if (syncCode==downSync) {
            if (normalSuccessed) {
                Log.e("down", "下载成功");
            }
            else {
                Log.e("down", "下载失败");
            }
        }
    }
});

6

数据显示

在数据下载完成后,用户可通过使用Database对象的getXclsInfo方法获取要素类,然后创建矢量图层对象VectorLayer,进行显示。

要素同步-下载.jpg 要素同步-下载.jpg

二、更新

针对从IGServer服务器上下载的本地数据,当IGServer服务器上的矢量图层发生改变时,如果需要对移动端本地数据进行同步,可以不用再次下载,直接利用更新操作即可。

需要注意:在更新之前,需要先将移动端本地数据库中的要素类和服务器中的图层数据进行捆绑,才能成功进行下一步的更新操作。

要素同步更新功能实现的关键步骤如下图所示:

要素同步-更新实现流程.png

1

获取在线数据、离线待更新数据

获取IGServer在线数据和已下载待更新数据;

//在线数据:服务基地址、图层URL、地图文档名称
String IGServerBaseURL = "http://webclient.smaryun.com:6163/igs";
String LayerURL="gdbp://MapGisLocal/武汉MKT/sfcls/四级点";
String docName="WuHan";
//离线数据
String databasePath=Environment.getExternalStorageDirectory().getPath()+"/MapGIS Mobile 2D Sample/Map/MapEdit/武汉MKT.mgdb";//数据库在手机内存中的路径
//构造数据库并打开
DataBase dataBase=new DataBase();
dataBase.open(databasePath);
//构造简单要素类并打开之前所下载的图层
SFeatureCls featureCls=new SFeatureCls(dataBase);
featureCls.open(i); //打开下载的图层对应的要素类

2

数据捆绑

在进行更新操作之前,需要将离线、在线数据进行捆绑,从而才能知道将什么在线数据更新到移动本地。同样可选择图层服务和地图服务两种方式。

//数据捆绑-图层服务(参数:矢量类对象、地图服务基地址、图层URL)
long b=FeatureSync.bind(featureCls, IGServerBaseURL, LayerURL);

//数据捆绑-地图服务(参数:矢量类对象、地图服务基地址、地图文档名称、地图ID、图层ID)
long b=FeatureSync.bind(featureCls, IGServerBaseURL, docName, mapID, layerID);

3

数据更新

在准备工作完成后,就可以进行具体的数据更新操作。更新操作同样是异步操作,不需用户开启子线程。

//返回long类型的数值,表示更新操作的编码
long updateSync = featureSync.update(featureCls);

4

更新监听

与下载操作一样,具有监听器可以监听更新的进度、结果信息,并且调用的接口也一致。

更新进度监听:

//更新进程回调(非主线程回调)
FeatureSync.setProgressListener(new ProgressListener() {
    @Override
    public void onProgress(long arg0, long arg1, long arg2, double arg3) {
        if (arg0 == updateSync) {
            Log.e("update", "更新任务编号:" + arg0 + "\n图层总数:" + arg1 + "\n当前图层ID:" + arg2 + "\n更新进度:" + arg3 + "%");
        }
    }
});

更新结果监听:

//更新结果回调(非主线程回调)
FeatureSync.setFinishedListener(new FinishedListener() {
    @Override
    public void onFinished(long syncCode, boolean normalSuccessed) {
        //回调函数参数:同步编辑的任务编码、是否正常完成
        if (syncCode==updateSync) {
            if (normalSuccessed) {
                Log.e("update", "更新成功");
            }
            else {
                Log.e("update", "更新失败");
            }
        }
    }
});

5

地图显示

在对离线数据更新完成之后,需要重新读取Database中的数据进行展示才能看到效果。

要素同步-更新.png 要素同步-更新.jpg

三、提交

针对从IGServer服务器上下载的本地数据,如果移动端本地数据库中的矢量图层要素发生改变,例如在移动端进行离线要素的编辑,可以将此图层中所编辑的要素数据提交到IGServer服务器上,实现离线和在线数据的同步。

需要注意:与数据更新一样,在提交数据之前,需要先将移动端本地数据库中的要素类和服务器中的图层数据进行捆绑,才能成功进行下一步的提交操作。

要素同步提交和更新的实现基本类似,功能实现的关键步骤如下:

要素同步-提交实现流程.png

1

获取在线数据、离线待更新数据

获取IGServer在线数据和已下载待更新数据,方法与更新操作一致。

2

数据捆绑

在进行提交操作之前,同样需要将离线、在线数据进行捆绑。

//数据捆绑-图层服务(参数:矢量类对象、地图服务基地址、图层URL)
long b=FeatureSync.bind(featureCls, IGServerBaseURL, LayerURL);

//数据捆绑-地图服务(参数:矢量类对象、地图服务基地址、地图文档名称、地图ID、图层ID)
long b=FeatureSync.bind(featureCls, IGServerBaseURL, docName, mapID, layerID);

3

数据提交

提交数据。

//返回long类型的数值,表示提交操作的编码
long commitSync = featureSync.commit(featureCls);

4

提交监听

与下载、更新操作一样,具有监听器可以监听提交的进度、结果信息,并且调用的接口也一致。

提交进度监听:

//提交进程回调(非主线程回调)
FeatureSync.setProgressListener(new ProgressListener() {
    @Override
    public void onProgress(long arg0, long arg1, long arg2, double arg3) {
        if (arg0 == commitSync) {
            Log.e("update", "提交任务编号:" + arg0 + "\n图层总数:" + arg1 + "\n当前图层ID:" + arg2 + "\n提交进度:" + arg3 + "%");
        }
    }
});

提交结果监听:

//提交结果回调(非主线程回调)
FeatureSync.setFinishedListener(new FinishedListener() {
    @Override
    public void onFinished(long syncCode, boolean normalSuccessed) {
        //回调函数参数:同步编辑的任务编码、是否正常完成
        if (syncCode==commitSync) {
            if (normalSuccessed) {
                Log.e("commit", "提交成功");
            }
            else {
                Log.e("commit", "提交失败");
            }
        }
    }
});

5

地图显示

在对离线数据更新完成之后,需要重新读取Database中的数据进行展示才能看到效果。

要素同步-提交.jpg 要素同步-提价.png